// api/request.js
import config from '../config.js';

// 请求队列（控制 loading）
let queue = 0;

/**
 * 封装 wx.request
 * @param {Object} options  同 wx.request 参数
 * @param {Boolean} hideLoading  是否隐藏全局 loading
 * @returns {Promise}
 */
function request(options = {}, hideLoading = false) {
  // 1. 拼接完整 url
  options.url = config.baseURL + options.url;

  // 2. 默认 header
  options.header = {
    'Content-Type': 'application/json;charset=utf-8',
    ...options.header
  };

  // 3. 自动携带 token
  const token = wx.getStorageSync('token') || config.token;
  if (token) options.header.Authorization = `Bearer ${token}`;

  // 4. 控制 loading
  if (!hideLoading) {
    queue === 0 && wx.showLoading({ title: '加载中…', mask: true });
    queue++;
  }

  return new Promise((resolve, reject) => {
    wx.request({
      ...options,
      timeout: config.timeout,
      success(res) {
        const { statusCode, data } = res;
        // 4.1 统一业务状态码处理
        if (statusCode === 200) {
          console.log('请求成功:', data);
          if (data.code === 200) {
            resolve(data.data || data.rows || true);          // 成功
          } else if (data.code === 401) {
            // 登录态失效
            wx.clearStorageSync();
            wx.reLaunch({ url: '/pages/login/index' });
            reject(data);
          } else {
            wx.showToast({ title: data.msg || '业务错误', icon: 'none' });
            reject(data);
          }
        } else {
          wx.showToast({ title: `网络错误(${statusCode})`, icon: 'none' });
          reject(res);
        }
      },
      fail(err) {
        wx.showToast({ title: '网络异常', icon: 'none' });
        reject(err);
      },
      complete() {
        console.log('请求结束:', options.url);
        if (!hideLoading) {
          queue--;
          queue === 0 && wx.hideLoading();
        }
      }
    });
  });
}

['get', 'post', 'put', 'delete'].forEach(method => {
  request[method] = (url, data = {}, options = {}) =>
    request({ method: method.toUpperCase(), url, data, ...options });
});

export default request;